<?php
/**
 * Class Sql
 * @author zhaojin
 */

//利用mysqli实现数据库的封装(mysqli的面向对象特性)
class Sql
{
    /**
     * @var string $host 主机地址
     * @var string $username 用户名
     * @var string $password 密码
     * @var int $port 端口
     * @var string $dbname 数据库名
     * @var string $charset 字符集
     */
    private $host;
    private $username;
    private $password;
    private $port;
    private $dbname;
    private $charset;

    /**
     * 初始化:确保用户传入了数据,否则使用默认值
     * Sql constructor.
     * @param array $info
     */
    public function __construct(array $info = [])
    {
        $this->host = $info['host'] ?? 'localhost';
        $this->username = $info['username'] ?? 'root';
        $this->password = $info['password'] ?? 'root';
        $this->port = $info['port'] ?? 3306;
        $this->dbname = $info['dbname'] ?? 'test';
        $this->charset = $info['charset'] ?? 'utf8';
        //在构造方法中调用连接认证
        $this->sql_connect();
        //字符集设定
        $this->sql_charset();
    }

    /**
     * 数据库的连接认证
     * 增加一个属性保存mysqli的连接对象,需要跨方法使用
     * @var object $link 连接对象
     */
    private $link;

    private function sql_connect()
    {
        $this->link = @new Mysqli($this->host, $this->username, $this->password, $this->dbname, $this->port);
        //验证连接是否成功
        if ($this->link->connect_error) {
            //mysqli对象有两个属性:connect_errno表示错误编号,connect_error表示错误信息:发生错误后终止脚本执行
            die('Connect Error : ' . $this->link->connect_errno . '<br>' . 'Message : ' . $this->link->connect_error);
        }
    }

    /**
     * 设定字符集
     */
    private function sql_charset()
    {
        //组织sql
        $sql = 'set names ' . $this->charset;
        //mysqli::query()
        $res = $this->link->query($sql);
        //错误判定
        if (!$res) {
            die('Charset Error : ' . $this->link->errno . '<br>' . 'Message : ' . $this->link->error);
        }
    }

    /**
     * 写操作
     * @param string $sql sql语句
     * @var int $affected_rows 保留上此写操作受影响的行数
     */
    public  $affected_rows;

    public function sql_exec(string $sql)
    {
        //执行sql
        $res = $this->link->query($sql);
        //判断sql有没有语法错误
        if (!$res) {
            die('SQL Error : ' . $this->link->errno . '<br>' . 'Message : ' . $this->link->error);
        }
        //记录当前受影响的行数
        $this->affected_rows = $this->link->affected_rows;
        //执行完毕:没有问题,返回结果
        return $res;
    }

    /**
     * 获取自增长id
     * insert_id是在mysqli对象执行query方法时获得
     */
    public function sql_insert_id(){
        return $this->link->insert_id;
    }

    /**
     * 读操作
     * @param string $sql //查询语句
     * @param bool false $is_all 是否查询全部数据,默认为false
     * @var int $num_rows 记录当前查询的行数
     */
    public  $num_rows;

    public function sql_query(string $sql, bool $is_all = false)
    {
        //执行sql
        $res = $this->link->query($sql);
        //操作成功记录行数
        $this->num_rows = $res->num_rows;

        //判断sql有没有语法错误
        if (!$res) {
            die('SQL Error : ' . $this->link->errno . '<br>' . 'Message : ' . $this->link->error);
        }
        //执行完毕:没有问题,解析数据
        if ($is_all) {//获取所有数据
            return $res->fetch_all(1);
        } else {//获取一条数据
            return $res->fetch_assoc();
        }
    }
}


















